package vaildator

import (
	"fmt"
	"github.com/go-playground/locales/zh_Hans_CN"
	unTrans "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zhTrans "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
)

// Validate 数据验证模块
// 如果传入的是接口类型，其实还是要做一个就说类型断言的操作，来区分传入的是什么类型
// 由于我这里设置的是user和admin的类型，所以嘛
func Validate(data any) (string, error) {
	validate := validator.New()
	// 给翻译实例化，转为汉语中文
	uni := unTrans.New(zh_Hans_CN.New())
	trans, _ := uni.GetTranslator("zh_Hans_CN")

	// 注册默认的翻译
	err := zhTrans.RegisterDefaultTranslations(validate, trans)
	if err != nil {
		fmt.Println("err:", err)
	}

	// 这里的操作就是映射提示的名字的信息啦，将tag里面的label给替换
	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		return label
	})

	// 在此之前要进行数据断言的，这里传入的已经确定是结构体
	err = validate.Struct(data)
	if err != nil {
		for _, v := range err.(validator.ValidationErrors) {
			return v.Translate(trans), err
		}
	}
	return "", nil
}
